﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using DAL.Entities;
using DAL.Eceptions;

namespace BAL
{
    public class ClienteBAL
    {
        public ClienteBAL() { }

        public ClienteEntity GetClienteByUsernameAndPassword(UsuarioEntity user)
        {
            try {
                ClienteDAL dal = new ClienteDAL();
                return dal.GetClienteByUsernameAndPassword(user);
            }catch(Exception ex){
                throw ex;
            }
        }
        /// <summary>
        /// Funcion que devuelve los clientes
        /// </summary>
        /// <returns></returns>
        public ClienteEntity GetClientesByTelefono(ClienteEntity _cliente)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.GetClientesByTelefono(_cliente);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        /// <summary>
        /// Funcion que cambia un cliente A proveedor
        /// </summary>
        /// <returns></returns>
        public ProveedorEntity CambiarClienteAProveedor(ProveedorEntity prov, ClienteEntity cli)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.CambiarClienteAProveedor(prov,cli);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Funcion que devuelve los clientes
        /// </summary>
        /// <returns></returns>
        public List<ClienteEntity> GetClientes()
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.GetClientes();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        /// <summary>
        /// Funcion que devuelve los clientes
        /// </summary>
        /// <returns></returns>
        public ClienteEntity GetClienteById(ClienteEntity _cliente)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.GetClienteById(_cliente);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        /// <summary>
        /// Funcion que actualiza un cliente
        /// </summary>
        /// <returns></returns>
        public bool UpdateCliente(ClienteEntity client)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.UpdateCliente(client);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Funcion que agrega un rol
        /// </summary>
        /// <returns></returns>
        public ClienteEntity AddCliente(ClienteEntity client)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.AddCliente(client);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Funcion que devuelve los clientes filtrado
        /// </summary>
        /// <returns></returns>
        public List<ClienteEntity> GetClientesFiltre(ClienteEntity _cliente)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.GetClientesFiltre(_cliente);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        /// <summary>
        /// Funcion que devuelve los clientes
        /// </summary>
        /// <returns></returns>
        public ClienteEntity GetClientesByDNI(ClienteEntity _cliente)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.GetClientesByDNI(_cliente);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Funcion que borra un rol
        /// </summary>
        /// <returns></returns>
        public bool DeleteCliente(ClienteEntity cliente)
        {
            try
            {
                ClienteDAL dal = new ClienteDAL();
                return dal.DeleteCliente(cliente);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public ClienteEntity GetClienteByUserId(int userId)
        {
            ClienteDAL dal = new ClienteDAL();
            return dal.GetClienteByUserId(userId);
        }

        //TODO: Instanciar el dal en el contructor
        public TarjetaEntity GetTarjetaByClienteId(int idCliente)
        {
            ClienteDAL dal = new ClienteDAL();
            return dal.GetTarjetaByClienteId(idCliente);
        }

        public int AddTarjeta(int nroTarjeta, string tipoTarjeta, int codigoVerificador)
        {
            ClienteDAL dal = new ClienteDAL();
            return dal.AddTarjeta(nroTarjeta, tipoTarjeta, codigoVerificador);
        }

        public void ExecuteCarga(string fechaActual, float monto, int intIdCliente, int tipoPago, int idTarjeta)
        {
            ClienteDAL dal = new ClienteDAL();
            dal.ExecuteCarga(fechaActual, monto, intIdCliente, tipoPago, idTarjeta);
        }

        public void ComprarCupon(string codigoCupon, int stock, int cantMaxXCli, int idCliente, string fechaActual)
        {
            ClienteDAL dal = new ClienteDAL();

            if (dal.GetComprasByCupon(codigoCupon, idCliente) < cantMaxXCli)
            {
                dal.ConfirmCompra(codigoCupon, idCliente, fechaActual);
            }
            else
            {
                throw new CliSuperaCantMaxException("No puede comprar este cupon /npor haber superado la cantidad maxima");
            }
        }

        public void ReturnCupon(DateTime fechaActual, int idCliente, string codigoCupon, string motivo)
        {
            ClienteDAL dal = new ClienteDAL();
            dal.ReturnCupon(fechaActual, idCliente, codigoCupon, motivo);
        }
    }
}
